/**
默认情况下，通信是同步且无缓冲的：在有接受者接收数据之前，发送不会结束。
可以想象一个无缓冲的通道在没有空间来保存数据的时候：
		必须要一个接收者准备好接收通道的数据然后发送者可以直接把数据发送给接收者。
		所以通道的发送/接收操作在对方准备好之前是阻塞的


1）对于同一个通道，发送操作（协程或者函数中的），在接收者准备好之前是阻塞的：
		如果ch中的数据无人接收，就无法再给通道传入其他数据：新的输入无法在通道非空的情况下传入。
		所以发送操作会等待 ch 再次变为可用状态：就是通道值被接收时（可以传入变量）。

2）对于同一个通道，接收操作是阻塞的（协程或函数中的），直到发送者可用：如果通道中没有数据，接收者就阻塞了。

		尽管这看上去是非常严格的约束，实际在大部分情况下工作的很不错
 */

package main

import (
	"fmt"
	"time"
)

func f1(ch chan int)  {
	fmt.Println(<-ch)
}

func main()  {
	out:=make(chan int)
	out<-2  //挪到go下面就是对的了
	go f1(out)


	time.Sleep(1e9)
}
//fatal error: all goroutines are asleep - deadlock!
/**
解决方式
1.把go f1放在写通道操作前
2.make时传入第二个参数(通道可以同时容纳的元素)
 */
